package com.atguigu.tingshu.album.service;

import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.model.album.TrackInfo;
import com.atguigu.tingshu.query.album.TrackInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumTrackListVo;
import com.atguigu.tingshu.vo.album.TrackInfoVo;
import com.atguigu.tingshu.vo.album.TrackListVo;
import com.atguigu.tingshu.vo.album.TrackStatVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

public interface TrackInfoService extends IService<TrackInfo> {

    /**
     * 上传音频文件
     * @param file 音频文件
     * @return map
     */
    Map<String, Object> uploadTrack(MultipartFile file);


    /**
     * 保存音频文件到专辑中
     * @param trackInfoVo 音频文件信息vo
     */
    void saveTrackInfo(TrackInfoVo trackInfoVo);

    /**
     * 分页查询用户名下的音频数据
     * @param trackInfoIPage 分页对象
     * @param query 查询信息对象vo
     * @return 包含了音频数据的分页集合对象
     */
    IPage<TrackListVo> findUserTrackPage(IPage<TrackListVo> trackInfoIPage, TrackInfoQuery query);

    /**
     * 根据id查询音频信息
     * @param trackId 音频id
     * @return 音频信息
     */
    TrackInfo getTrackInfo(Long trackId);

    /**
     * 修改音频信息
     * @param trackId 音频id
     * @param trackInfoVo 音频修改信息vo
     */
    void updateTrackInfo(Long trackId, TrackInfoVo trackInfoVo);

    /**
     * 删除音频信息
     * @param trackId 音频id
     */
    void removeTrackInfo(Long trackId);


    /**
     * 根据专辑id获取当前专辑下的音频信息
     * @param albumId 专辑id
     * @param page 分页数据
     * @return 音频数据
     */
    IPage<AlbumTrackListVo> findAlbumTrackPage(Long albumId, IPage<AlbumTrackListVo> page);


    /**
     * 根据音频id获取音频的统计信息
     * @param trackId 音频id
     * @return 音频统计信息
     */
    TrackStatVo getTrackStatVo(Long trackId);

    /**
     * 根据音频id集合获取音频信息
     * @param trackIdList 音频id集合
     * @return 音频信息
     */
    List<TrackListVo> getTrackInfoListByIds(List<Long> trackIdList);

    /**
     * 根据用户id及音频id获取当前用户访问这个音频的购买信息页面
     * @param trackId 音频id
     * @param userId 用户id
     * @return 当前用户访问当前音频进行购买操作的页面显示数据
     */
    List<Map<String, Object>> findUserTrackPaidList(Long trackId, Long userId);

    /**
     * [rpc]
     * 获取用户当前可购买的声音列表数据
     * @param userId 用户id
     * @param albumId 专辑id
     * @param trackId 音频id
     * @param trackCount 购买集数
     * @return 可购买音频列表
     */
    Result<List> getCanPaidTrackInfoList(Long userId, Long albumId, Long trackId, Integer trackCount);
}
